<?php
/**
 * @author hjj
 * 海南宝球供应商订单
 * 电商平台负责申报支付单，供应商申报订单和清单
 */
namespace App\Service\OrderService\OrderRouteService;

use App\Service\Code\Normal;
use App\Model\PssModel\OrderSupplier;
use Service\AppService\IdService;
use App\Service\OrderService\BaseSupplierRouterService;
use App\Service\VendorClient\ShophnbaoqiuApi\ShophnbaoqiuApiClient;

class Shophnbaoqiu extends BaseSupplierRouterService
{

    /**
     * 创建订单
     * @param array $param
     * @return mixed
     */
    public function createOrder( $param = [] )
    {
        //下单商品重组
        $supplierGoodsInfo  = $param['supplierGoodsInfo'];
        $requestOrder       = $param['order'];
        $userGoodsList      = $supplierGoodsInfo['userGoodsList'];
        $goodsList          = $supplierGoodsInfo['goodsList'];
        $orderItems         = [];
        $supplierCode       = $supplierGoodsInfo['supplierCode'];
        //按照仓区进行拆单 目前就一个仓库 不排除后面会有其它仓库
        $defaultStockGroupGoodsList = [];
        foreach ($goodsList as $item ) {
            $defaultStockGroupGoodsList[$item['defaultStock']][] = $item;
            unset($item);
        }

        //下游是否申报
        $isDelare = (
            (isset($param['order']['isOrderDeclare']) && $param['order']['isOrderDeclare'] == 1) ||
            (isset($param['order']['isPayDeclare']) && $param['order']['isPayDeclare'] == 1)
            ) ? true : false;
        //是否云仓商城
        $isShop = isset($param['order']['isSplitOrder']) && $param['order']['isSplitOrder'] == 1 ? true : false ;
        //先判断非云仓商城订单 不能多个商品下单
        if( $isDelare && !$isShop && count($requestOrder['goods']) > 1 )
        {
            return Normal::returnCode(Normal::FAIL,"当前订单不支持多商品下单[100010]");
        }

        foreach ($defaultStockGroupGoodsList as $item )
        {
            $currentGoods = current($item);
			$supplierCommodityType = $currentGoods['supplierCommodityType'];
            //判断云仓商城 多商品拆单
            foreach ($item as $itemValue) {
                //重新合并每一个仓库商品
                $orderGoods = $userGoodsList[$itemValue['skuCode']];

                //生成供应商主单号
                $param['order']['supplier_psn'] = OrderSupplier::instance()->getCreateOrderSn($supplierCode);
                $param['order']['supplier_csn'] = IdService::instance()->getOtherID();

                //防止订单号重复问题,下游已申报，则使用下游的订单号作为中台子单号
                if( $isDelare && !$isShop && $supplierCommodityType != GOODS_TYPE_YBMY ) {
                    $param['order']['supplier_dsn'] = $param['order']['orderSn'];
                } else {
                    $param['order']['supplier_dsn'] = IdService::instance()->getOtherID();
                }

                $param['order']['goods'] = $orderGoods;
                $param['order']['isQueryExpress'] = 1;
                $res = OrderSupplier::instance()->getSupplierCreateOrderData($param);
                if( $res['code'] != Normal::SUC ) {
                    return $res;
                }
                $orderItems[] = $res['data'];
            }
        }

        return Normal::returnCode(Normal::SUC,"获取成功",[
            'supplierCode' => $supplierCode,
            'orderItems' => $orderItems
        ]);
    }

    /**
     * 订单支付
     * @param array $param
     * @return mixed
     */
    public function orderPay( $param = [] )
    {
        return $this->callSdkApi(ShophnbaoqiuApiClient::class,$param['apiBody'])->createOrder($param);
    }

    /**
     * 订单取消
     * @param array $param
     * @return mixed
     */
    public function orderCancel( $param = [] )
    {
        return Normal::returnCode(Normal::SUC,"处理完成");
    }

    /**
     * 订单售后
     * @param array $param
     * @return mixed
     */
    public function orderAfterSale( $param = [] )
    {
        return Normal::returnCode(Normal::SUC,"处理完成");
    }

    /**
     * 商品列表查询接口
     * @param array $param
     * @return mixed
     */
    public function queryGoodsList( $param = [] )
    {
        $res = $this->callSdkApi(ShophnbaoqiuApiClient::class,$param['apiBody'])->{__FUNCTION__}($param['queryBody']);
        if( $res['code'] != Normal::SUC ) {
            return $res;
        }
        return Normal::returnCode(Normal::SUC,"获取成功",[
            'total' => count($res['data']['items']),
            'list'  => $res['data']['items']
        ]);
    }

    /**
     * 获取物流信息
     * @param array $param
     */
    public function queryOrderExpress( $param = [] )
    {
        $queryBody = $param['queryBody'];
        $apiBody   = $param['apiBody'];
        $orderID   = $queryBody['orderID'];
        $orderInfo = OrderSupplier::instance()->info(['id'=>$orderID,'company_id'=>$queryBody['supplierID']]);
        if( empty($orderInfo) ) {
            return Normal::returnCode(Normal::FAIL,"订单信息不存在，请核对！");
        }

        $res = $this->callSdkApi(ShophnbaoqiuApiClient::class,$apiBody)->{__FUNCTION__}($orderInfo);
        if ($res['code'] != Normal::SUC) {
            return Normal::returnCode(Normal::FAIL, $res['msg']);
        }
        if (!isset($res['data']['items']) || empty($res['data']['items'])) {
            return Normal::returnCode(Normal::FAIL, "供应商无订单数据");
        }
        $expressInfo = reset($res['data']['items']);
        if (!isset($expressInfo['wayBillNo']) || empty($expressInfo['wayBillNo'])) {
            return Normal::returnCode(Normal::FAIL, "还未发货");
        }
        if (!isset($expressInfo['logistics']) || empty($expressInfo['logistics'])) {
            return Normal::returnCode(Normal::FAIL, "还未发货");
        }
        $expressName = $expressInfo['logistics'];
        $expressNo   = $expressInfo['wayBillNo'];
        return Normal::returnCode(Normal::SUC, "已发货", [
            'expressInfo' => [
                'express_name' => mb_strtoupper($expressName, 'utf-8'),
                'express_sn'   => $expressNo,
            ],
        ]);
    }
}
